home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / MATH / FPU / FPU.DOC next >
Text File  |  1991-12-22  |  2KB  |  44 lines

  1. Although Turbo Pascal v6.0 can compile down to 80286/80287 instructions
  2. creating more efficient code than the 8086/8088, 80387 instructions are out
  3. of reach.  The 80386 has just a few minor instruction additions over the
  4. 80286 with most of them only of concern to someone writing an operating
  5. system.  The 80287 isn't much different from the 8087.  But the 80387 math
  6. coprocessor fixes some shortcomings of the 80287 and adds a few new
  7. instructions.
  8.  
  9. The 80287 places restrictions on the values passed to FATAN and FPTAN, but
  10. the 80387 makes these instructions much simpler.  The 80387 adds the
  11. transendentals FSIN and FCOS.  My time trials found that the following
  12. pascal functions making direct calls to the 80387 executed about four times
  13. faster than normal Pascal calls.  I have a 25Mhz Cyrix FasMath Coprocessor,
  14. so your results may differ if you have IIT or Intel coprocessors.
  15.  
  16. To use these functions, you can include them in your source code or make
  17. a unit with them.  To access them, globally replace function calls like
  18. cos() to fcos().  Set your compiling options as follows:  286 instructions
  19. on, 8087/80287 on, emulation off.  I don't check if an 80387 is present,
  20. so these functions work ONLY if used with an 80387 or 80486 DX and not on
  21. the 8087/80287.
  22.  
  23. After testing FSQRT, I found it ran 18% SLOWER than letting Turbo Pascal
  24. use sqrt(), so I didn't include it here.  Using Turbo Debugger, I found
  25. the coding for FSQRT contained lots of call overhead while sqrt() made the
  26. call a lot more efficiently, so other functions like abs(), sqr() and int()
  27. are not included.
  28.  
  29. I'm not an 80x86 assembly guru, but I know enough to be dangerous at this
  30. point.  I have tested these functions against normal Pascal functions, so
  31. they work and return accurate results.  I have found the floating-point
  32. type "single" sufficient for my needs but you could replace "single" with
  33. "double" or "extended" just the same; the compiler will handle the changes
  34. in data sizes.  These function calls are pretty simple and straight-forward
  35. but if there's anything "dangerous" in the code, please let me know.
  36.  
  37. Erik Olbrys
  38. December 1991
  39. CIS 71236,1245
  40.  
  41.  
  42. Explanations of the 387/386 opcodes adapted from:
  43. Microsoft's 80386/80486 Programming Guide, 2nd ed. by Ross P. Nelson
  44.